LEADTOOLS Barcode (Leadtools.Barcode assembly)

ReadBarcodes(RasterImage,LogicalRectangle,Int32,BarcodeSymbology[],BarcodeReadOptions[]) Method

Show in webframe
Example 







A Leadtools.RasterImage object that contains the image data. Must not be null (Nothing in Visual Basic).
A Leadtools.Forms.LogicalRectangle that specifies the region of interest area in the image where the barcodes search and detection is performed. You can specify LogicalRectangle.Empty to indicate that the search must be performed on the whole image.
An System.Int32 that specifies the maximum number of barcodes to return. Must be a value greater than or equal to 0. The value of 0 means all barcodes.
An array of BarcodeSymbology enumeration members that specifies the barcode symbologies (types) to search for.
An array of BarcodeReadOptions that specifies the options to use. This can be null (Nothing in Visual Basic), where the current default options is used. Otherwise, the method will use the options that corresponds to the symbologies being read, if the array does not contain specific options for a symbologies being read, then the default version will be used.
Read multiple barcodes from an image with symbologies from a specified group and options.
Syntax
'Declaration
 
Public Overloads Function ReadBarcodes( _
   ByVal image As RasterImage, _
   ByVal searchBounds As LogicalRectangle, _
   ByVal maximumBarcodes As Integer, _
   ByVal symbologies() As BarcodeSymbology, _
   ByVal options() As BarcodeReadOptions _
) As BarcodeData()
'Usage
 
Dim instance As BarcodeReader
Dim image As RasterImage
Dim searchBounds As LogicalRectangle
Dim maximumBarcodes As Integer
Dim symbologies() As BarcodeSymbology
Dim options() As BarcodeReadOptions
Dim value() As BarcodeData
 
value = instance.ReadBarcodes(image, searchBounds, maximumBarcodes, symbologies, options)
- (NSArray*)readBarcodes:(LTRasterImage*)image 
            searchBounds:(LeadRect)searchBounds 
         maximumBarcodes:(int)maximumBarcodes 
             symbologies:(LTBarcodeSymbology*)symbologies 
        symbologiesCount:(unsigned int)symbologiesCount 
                 options:(NSArray*)options 
                   error:(NSError**)outError;
            
public BarcodeData[] readBarcodes(
  RasterImage image, 
  LeadRect searchBounds, 
  int maximumBarcodes, 
  BarcodeSymbology[] symbologies, 
  BarcodeReadOptions[] options
)
            
 function Leadtools.Barcode.BarcodeReader.ReadBarcodes(RasterImage,LogicalRectangle,Int32,BarcodeSymbology[],BarcodeReadOptions[])( 
   image ,
   searchBounds ,
   maximumBarcodes ,
   symbologies ,
   options 
)

Parameters

image
A Leadtools.RasterImage object that contains the image data. Must not be null (Nothing in Visual Basic).
searchBounds
A Leadtools.Forms.LogicalRectangle that specifies the region of interest area in the image where the barcodes search and detection is performed. You can specify LogicalRectangle.Empty to indicate that the search must be performed on the whole image.
maximumBarcodes
An System.Int32 that specifies the maximum number of barcodes to return. Must be a value greater than or equal to 0. The value of 0 means all barcodes.
symbologies
An array of BarcodeSymbology enumeration members that specifies the barcode symbologies (types) to search for.
options
An array of BarcodeReadOptions that specifies the options to use. This can be null (Nothing in Visual Basic), where the current default options is used. Otherwise, the method will use the options that corresponds to the symbologies being read, if the array does not contain specific options for a symbologies being read, then the default version will be used.

Return Value

An array of BarcodeData objects or derived classes that contains the symbology, data, location and any rotation angle for each barcode found. If no barcodes can be found, then this method will return an empty array (Length equals to 0).
Remarks

Use this method if you want to read multiple barcodes of the same or multiple symbologies from an image. For example, to read all UPC and QR barcodes in the image, use an array of BarcodeSymbology.UPC-A, BarcodeSymbology.UPC-E and BarcodeSymbology.QR.

LEADTOOLS barcode read engine is optimized for speed and can search for multiple similar symbologies at the same time. This method simply returns the first barcode that is detected correctly using the symbologies and current options.

The ReadSymbology event will occur before and after attempting to read any symbology. The read options being used whether the default or specified will be set in the BarcodeReadSymbologyEventArgs.Options property of the event data.

If symbologies is null (Nothing in Visual Basic), then this method will use all the currently available symbologies. If this parameter contains an empty array, then no barcode will be detected and an empty array will be returned.

The BarcodeReader provides the following barcode read methods:

Method Description
ReadBarcode(RasterImage image, LogicalRectangle searchBounds, BarcodeSymbology symbology) and ReadBarcode(RasterImage image, LogicalRectangle searchBounds, BarcodeSymbology symbology, BarcodeReadOptions options)

Read one barcode from an image with specified symbology and default or specific options. Use these methods if you want to read a single barcode from the image, for example, a QR symbol by specifying BarcodeSymbology.QR or if you want to read any barcode found regardless of its type by using BarcodeSymbology.Unknown.

ReadBarcode(RasterImage image, LogicalRectangle searchBounds, BarcodeSymbology[] symbologies) and ReadBarcode(RasterImage image, LogicalRectangle searchBounds, BarcodeSymbology[] symbologies, BarcodeReadOptions[] options)

Read one barcode from an image with a symbology from a specified group and default or specific options. Use these methods if you want to read a single barcode from a known group. For example, to read a barcode that can be of any UPC type, pass an array of BarcodeSymbology.UPCA and BarcodeSymbology.UPCE.

ReadBarcodes(RasterImage image, LogicalRectangle searchBounds, int maximumBarcodes, BarcodeSymbology[] symbologies) and ReadBarcodes(RasterImage image, LogicalRectangle searchBounds, int maximumBarcodes, BarcodeSymbology[] symbologies, BarcodeReadOptions[] options)

Read multiple barcodes from an image with symbologies from a specified group and default or specific options. Use these methods if you want to read multiple barcodes of the same or multiple symbologies.

Example
Copy Code  
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.Forms
Imports Leadtools.Barcode
Imports Leadtools.ImageProcessing

' This class holds the data we will pass to each thread
Public Class MyThreadData
   ' This worker thread name
   Public Name As String
   ' Barcode reader instance
   Public BarcodeReaderInstance As BarcodeReader

   ' Array of options to use
   Public ReadOptions() As BarcodeReadOptions

   ' Image file containing the barcodes
   Public ImageFileName As String

   ' This will hold the barcodes found
   Public Barcodes() As BarcodeData

   ' In case of errors
   Public Err As Exception

   ' Event to notify when the thread is finished
   Public FinishedEvent As AutoResetEvent
End Class


Public Sub BarcodeReader_ReadBarcodeExample6()
   Dim imageFileNames() As String = PrepareImages()

   ' Create a Barcode engine
   Dim engine As New BarcodeEngine()

   ' Get the Barcode reader instance
   Dim reader As BarcodeReader = engine.Reader

   ' Get a version of all read options that support rotated barcodes
   Dim verticalBarcodeReadOptions() As BarcodeReadOptions = GetVerticalReadBarcodeOptions(reader)

   ' Synchronization events
   Dim finishedEvents(2) As AutoResetEvent

   ' Create the thread data objects
   Dim threadsData(2) As MyThreadData
   For i As Integer = 0 To threadsData.Length - 1
      finishedEvents(i) = New AutoResetEvent(False)

      threadsData(i) = New MyThreadData()
      threadsData(i).BarcodeReaderInstance = reader
      threadsData(i).ReadOptions = Nothing
      threadsData(i).FinishedEvent = finishedEvents(i)
   Next

   ' Setup the read options for the two threads
   threadsData(0).Name = "Read Default Options Thread"
   threadsData(0).ReadOptions = Nothing  ' Default, or horizontal
   threadsData(1).Name = "Read Vertical Barcodes Thread"
   threadsData(1).ReadOptions = verticalBarcodeReadOptions

   Dim totalBarcodes As New List(Of BarcodeData)()

   ' Now loop through all the images and try to read the barcodes with both threads at the same time
   For Each imageFileName As String In imageFileNames
      Console.WriteLine("Reading barcodes from {0}", imageFileName)

      For i As Integer = 0 To 1
         ' Clear the previous results (if any), set up the file name and run
         threadsData(i).Barcodes = Nothing
         threadsData(i).Err = Nothing
         threadsData(i).ImageFileName = imageFileName
         ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf ReadBarcodesInThread), threadsData(i))
      Next

      ' Wait till all the threads finishes
      WaitHandle.WaitAll(finishedEvents)

      ' Add the barcodes found to our list
      For i As Integer = 0 To 1
         If Not IsNothing(threadsData(i).Err) Then
            Console.WriteLine("{0} had error {1}", threadsData(i).Name, threadsData(i).Err)
         ElseIf Not IsNothing(threadsData(i).Barcodes) Then
            totalBarcodes.AddRange(threadsData(i).Barcodes)
         End If
      Next
   Next

   ' We are done, show the total number of barcodes read
   Console.WriteLine("Done. Total barcodes read: {0}", totalBarcodes.Count)
End Sub

Private Shared Sub ReadBarcodesInThread(ByVal state As Object)
   Dim threadData As MyThreadData = DirectCast(state, MyThreadData)

   Console.WriteLine("{0} is reading the barcodes", threadData.Name)

   Try
      ' Load the image
      Using codecs As New RasterCodecs()
         Using image As RasterImage = codecs.Load(threadData.ImageFileName, 0, CodecsLoadByteOrder.BgrOrGray, 1, 1)
            ' Read the barcodes using our options
            threadData.Barcodes = threadData.BarcodeReaderInstance.ReadBarcodes(image, LogicalRectangle.Empty, 0, Nothing, threadData.ReadOptions)
         End Using
      End Using

      Console.WriteLine("{0} has read {1} barcodes", threadData.Name, threadData.Barcodes.Length)
   Catch ex As Exception
      ' Return the error to main
      threadData.Err = ex
   Finally
      ' Tell main we are done
      threadData.FinishedEvent.Set()
   End Try
End Sub

Private Shared Function PrepareImages() As String()
   ' Create a 90 degrees rotated version of Barcode1.tif

   Dim originalImageFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "Barcode1.tif")
   Dim rotatedImageFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "Barcode1_Rotated90.tif")

   Using codecs As New RasterCodecs()
      Using image As RasterImage = codecs.Load(originalImageFileName, 0, CodecsLoadByteOrder.BgrOrGray, 1, 1)
         Dim rotate As New RotateCommand(90 * 100, RotateCommandFlags.Resize, RasterColor.FromKnownColor(RasterKnownColor.White))
         rotate.Run(image)

         codecs.Save(image, rotatedImageFileName, RasterImageFormat.CcittGroup4, 1)
      End Using
   End Using

   Return New String() {originalImageFileName, rotatedImageFileName}
End Function

Private Shared Function GetVerticalReadBarcodeOptions(ByVal reader As BarcodeReader) As BarcodeReadOptions()
   ' By default, the options read horizontal barcodes only, create an array of options capable of reading vertical barcodes

   ' Notice, we cloned the default options in reader so we will not change the original options

   Dim oneDReadOptions As OneDBarcodeReadOptions = DirectCast(reader.GetDefaultOptions(BarcodeSymbology.UPCA).Clone(), OneDBarcodeReadOptions)
   oneDReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim fourStateReadOptions As FourStateBarcodeReadOptions = DirectCast(reader.GetDefaultOptions(BarcodeSymbology.USPS4State).Clone(), FourStateBarcodeReadOptions)
   fourStateReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim postNetPlanetReadOptions As PostNetPlanetBarcodeReadOptions = DirectCast(reader.GetDefaultOptions(BarcodeSymbology.PostNet).Clone(), PostNetPlanetBarcodeReadOptions)
   postNetPlanetReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim gs1StackedReadOptions As GS1DatabarStackedBarcodeReadOptions = DirectCast(reader.GetDefaultOptions(BarcodeSymbology.GS1DatabarStacked).Clone(), GS1DatabarStackedBarcodeReadOptions)
   gs1StackedReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim patchCodeReadOptions As PatchCodeBarcodeReadOptions = DirectCast(reader.GetDefaultOptions(BarcodeSymbology.PatchCode).Clone(), PatchCodeBarcodeReadOptions)
   patchCodeReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim pdf417ReadOptions As PDF417BarcodeReadOptions = DirectCast(reader.GetDefaultOptions(BarcodeSymbology.PDF417).Clone(), PDF417BarcodeReadOptions)
   pdf417ReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim microPdf417ReadOptions As MicroPDF417BarcodeReadOptions = DirectCast(reader.GetDefaultOptions(BarcodeSymbology.MicroPDF417).Clone(), MicroPDF417BarcodeReadOptions)
   microPdf417ReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   ' Even though this array will not contain all options, it should be enough to read all barcodes, since the version of ReadBarcodes we will use
   ' will use the default options if an overriden is not passed
   Dim readOptions() As BarcodeReadOptions = _
   { _
      oneDReadOptions, fourStateReadOptions, postNetPlanetReadOptions, gs1StackedReadOptions, patchCodeReadOptions, pdf417ReadOptions, microPdf417ReadOptions _
   }

   Return readOptions
End Function

Public NotInheritable Class LEAD_VARS
Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images"
End Class
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Forms;
using Leadtools.Barcode;
using Leadtools.ImageProcessing;

// This class holds the data we will pass to each thread
public class MyThreadData
{
   // This worker thread name
   public string Name;
   // Barcode reader instance
   public BarcodeReader BarcodeReaderInstance;

   // Array of options to use
   public BarcodeReadOptions[] ReadOptions;

   // Image file containing the barcodes
   public string ImageFileName;

   // This will hold the barcodes found
   public BarcodeData[] Barcodes;

   // In case of errors
   public Exception Error;

   // Event to notify when the thread is finished
   public AutoResetEvent FinishedEvent;
}


public void BarcodeReader_ReadBarcodeExample6()
{
   string[] imageFileNames = PrepareImages();

   // Create a Barcode engine
   BarcodeEngine engine = new BarcodeEngine();

   // Get the Barcode reader instance
   BarcodeReader reader = engine.Reader;

   // Get a version of all read options that support rotated barcodes
   BarcodeReadOptions[] verticalBarcodeReadOptions = GetVerticalReadBarcodeOptions(reader);

   // Synchronization events
   AutoResetEvent[] finishedEvents = new AutoResetEvent[2];

   // Create the thread data objects
   MyThreadData[] threadsData = new MyThreadData[2];
   for(int i = 0; i < threadsData.Length; i++)
   {
      finishedEvents[i] = new AutoResetEvent(false);

      threadsData[i] = new MyThreadData();
      threadsData[i].BarcodeReaderInstance = reader;
      threadsData[i].ReadOptions = null;
      threadsData[i].FinishedEvent = finishedEvents[i];
   }

   // Setup the read options for the two threads
   threadsData[0].Name = "Read Default Options Thread";
   threadsData[0].ReadOptions = null;  // Default, or horizontal
   threadsData[1].Name = "Read Vertical Barcodes Thread";
   threadsData[1].ReadOptions = verticalBarcodeReadOptions;

   List<BarcodeData> totalBarcodes = new List<BarcodeData>();

   // Now loop through all the images and try to read the barcodes with both threads at the same time
   foreach(string imageFileName in imageFileNames)
   {
      Console.WriteLine("Reading barcodes from {0}", imageFileName);

      for(int i = 0; i < 2; i++)
      {
         // Clear the previous results (if any), set up the file name and run
         threadsData[i].Barcodes = null;
         threadsData[i].Error = null;
         threadsData[i].ImageFileName = imageFileName;
         ThreadPool.QueueUserWorkItem(new WaitCallback(ReadBarcodesInThread), threadsData[i]);
      }

      // Wait till all the threads finishes
      WaitHandle.WaitAll(finishedEvents);

      // Add the barcodes found to our list
      for(int i = 0; i < 2; i++)
      {
         if(threadsData[i].Error != null)
         {
            Console.WriteLine("{0} had error {1}", threadsData[i].Name, threadsData[i].Error);
         }
         else if(threadsData[i].Barcodes != null)
         {
            totalBarcodes.AddRange(threadsData[i].Barcodes);
         }
      }
   }

   // We are done, show the total number of barcodes read
   Console.WriteLine("Done. Total barcodes read: {0}", totalBarcodes.Count);
}

private static void ReadBarcodesInThread(object state)
{
   MyThreadData threadData = state as MyThreadData;

   Console.WriteLine("{0} is reading the barcodes", threadData.Name);

   try
   {
      // Load the image
      using(RasterCodecs codecs = new RasterCodecs())
      {
         using(RasterImage image = codecs.Load(threadData.ImageFileName, 0, CodecsLoadByteOrder.BgrOrGray, 1, 1))
         {
            // Read the barcodes using our options
            threadData.Barcodes = threadData.BarcodeReaderInstance.ReadBarcodes(image, LogicalRectangle.Empty, 0, null, threadData.ReadOptions);
         }
      }

      Console.WriteLine("{0} has read {1} barcodes", threadData.Name, threadData.Barcodes.Length);
   }
   catch(Exception ex)
   {
      // Return the error to main
      threadData.Error = ex;
   }
   finally
   {
      // Tell main we are done
      threadData.FinishedEvent.Set();
   }
}

private static string[] PrepareImages()
{
   // Create a 90 degrees rotated version of Barcode1.tif

   string originalImageFileName = Path.Combine(LEAD_VARS.ImagesDir, "Barcode1.tif");
   string rotatedImageFileName = Path.Combine(LEAD_VARS.ImagesDir, "Barcode1_Rotated90.tif");

   using(RasterCodecs codecs = new RasterCodecs())
   {
      using(RasterImage image = codecs.Load(originalImageFileName, 0, CodecsLoadByteOrder.BgrOrGray, 1, 1))
      {
         RotateCommand rotate = new RotateCommand(90 * 100, RotateCommandFlags.Resize, RasterColor.FromKnownColor(RasterKnownColor.White));
         rotate.Run(image);

         codecs.Save(image, rotatedImageFileName, RasterImageFormat.CcittGroup4, 1);
      }
   }

   return new string[] { originalImageFileName, rotatedImageFileName };
}

private static BarcodeReadOptions[] GetVerticalReadBarcodeOptions(BarcodeReader reader)
{
   // By default, the options read horizontal barcodes only, create an array of options capable of reading vertical barcodes

   // Notice, we cloned the default options in reader so we will not change the original options

   OneDBarcodeReadOptions oneDReadOptions = reader.GetDefaultOptions(BarcodeSymbology.UPCA).Clone() as OneDBarcodeReadOptions;
   oneDReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   FourStateBarcodeReadOptions fourStateReadOptions = reader.GetDefaultOptions(BarcodeSymbology.USPS4State).Clone() as FourStateBarcodeReadOptions;
   fourStateReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   PostNetPlanetBarcodeReadOptions postNetPlanetReadOptions = reader.GetDefaultOptions(BarcodeSymbology.PostNet).Clone() as PostNetPlanetBarcodeReadOptions;
   postNetPlanetReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   GS1DatabarStackedBarcodeReadOptions gs1StackedReadOptions = reader.GetDefaultOptions(BarcodeSymbology.GS1DatabarStacked).Clone() as GS1DatabarStackedBarcodeReadOptions;
   gs1StackedReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   PatchCodeBarcodeReadOptions patchCodeReadOptions = reader.GetDefaultOptions(BarcodeSymbology.PatchCode).Clone() as PatchCodeBarcodeReadOptions;
   patchCodeReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   PDF417BarcodeReadOptions pdf417ReadOptions = reader.GetDefaultOptions(BarcodeSymbology.PDF417).Clone() as PDF417BarcodeReadOptions;
   pdf417ReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   MicroPDF417BarcodeReadOptions microPdf417ReadOptions = reader.GetDefaultOptions(BarcodeSymbology.MicroPDF417).Clone() as MicroPDF417BarcodeReadOptions;
   microPdf417ReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   // Even though this array will not contain all options, it should be enough to read all barcodes, since the version of ReadBarcodes we will use
   // will use the default options if an overriden is not passed
   BarcodeReadOptions[] readOptions =
   {
      oneDReadOptions, fourStateReadOptions, postNetPlanetReadOptions, gs1StackedReadOptions, patchCodeReadOptions, pdf417ReadOptions, microPdf417ReadOptions
   };

   return readOptions;
}

static class LEAD_VARS
{
public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images";
}
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Forms;
using Leadtools.Barcode;
using Leadtools.ImageProcessing;
using Leadtools.Examples;

// This class holds the data we will pass to each thread
public class MyThreadData
{
   // This worker thread name
   public string Name;
   // Barcode reader instance
   public BarcodeReader BarcodeReaderInstance;

   // Array of options to use
   public BarcodeReadOptions[] ReadOptions;

   // Image file name containing the barcodes
   public string ImageFileName;

   // Image containing the barcodes
   public RasterImage Image;

   // This will hold the barcodes found
   public BarcodeData[] Barcodes;

   // In case of errors
   public Exception Error;

   // Event to notify when the thread is finished
   public AutoResetEvent FinishedEvent;
}


[Asynchronous]
public void BarcodeReaderReadBarcodeExample6()
{
   BarcodeReader_ReadBarcodeExample6();
   EnqueueTestComplete();
}

public void BarcodeReader_ReadBarcodeExample6()
{
   RasterImage[] images = new RasterImage[2];
   string originalImageFileName = "Barcode1.tif";
   string rotatedImageFileName = "Barcode1_Rotated90.tif";
   string[] imageFileNames = new string[] { originalImageFileName, rotatedImageFileName };

   using (SampleImageStream outputStream = new SampleImageStream("Barcode1_Rotated90.tif"))
   {
      images[0] = SampleImage.Get(SampleImageNames.Barcode1_tif).Clone();
      images[1] = SampleImage.Get(SampleImageNames.Barcode1_tif).Clone();
      RotateImage(images[1]);

      // Create a Barcode engine
      BarcodeEngine engine = new BarcodeEngine();

      // Get the Barcode reader instance
      BarcodeReader reader = engine.Reader;

      // Get a version of all read options that support rotated barcodes
      BarcodeReadOptions[] verticalBarcodeReadOptions = GetVerticalReadBarcodeOptions(reader);

      // Synchronization events
      AutoResetEvent[] finishedEvents = new AutoResetEvent[2];

      // Create the thread data objects
      MyThreadData[] threadsData = new MyThreadData[2];
      for (int i = 0; i < threadsData.Length; i++)
      {
         finishedEvents[i] = new AutoResetEvent(false);

         threadsData[i] = new MyThreadData();
         threadsData[i].BarcodeReaderInstance = reader;
         threadsData[i].ReadOptions = null;
         threadsData[i].FinishedEvent = finishedEvents[i];
      }

      // Setup the read options for the two threads
      threadsData[0].Name = "Read Default Options Thread";
      threadsData[0].ReadOptions = null;  // Default, or horizontal
      threadsData[1].Name = "Read Vertical Barcodes Thread";
      threadsData[1].ReadOptions = verticalBarcodeReadOptions;

      List<BarcodeData> totalBarcodes = new List<BarcodeData>();

      // Now loop through all the images and try to read the barcodes with both threads at the same time
      int index = 0;
      foreach (RasterImage image in images)
      {
         Console.WriteLine("Reading barcodes from {0}", imageFileNames[index]);

         for (int i = 0; i < 2; i++)
         {
            // Clear the previous results (if any), set up the file name and run
            threadsData[i].Barcodes = null;
            threadsData[i].Error = null;
            threadsData[i].Image = image;
            threadsData[i].ImageFileName = imageFileNames[index];
            ThreadPool.QueueUserWorkItem(new WaitCallback(ReadBarcodesInThread), threadsData[i]);
         }

         // Wait till all the threads finishes
         WaitHandle.WaitAll(finishedEvents);

         // Add the barcodes found to our list
         for (int i = 0; i < 2; i++)
         {
            if (threadsData[i].Error != null)
            {
               Console.WriteLine("{0} had error {1}", threadsData[i].Name, threadsData[i].Error);
            }
            else if (threadsData[i].Barcodes != null)
            {
               totalBarcodes.AddRange(threadsData[i].Barcodes);
            }
         }

         index++;
      }

      // We are done, show the total number of barcodes read
      Console.WriteLine("Done. Total barcodes read: {0}", totalBarcodes.Count);
   }
}

private static void ReadBarcodesInThread(object state)
{
   MyThreadData threadData = state as MyThreadData;

   Console.WriteLine("{0} is reading the barcodes", threadData.Name);

   try
   {
      // Load the image
      RasterCodecs codecs = new RasterCodecs();

      using(RasterImage image = codecs.Load(threadData.ImageFileName, 0, CodecsLoadByteOrder.BgrOrGray, 1, 1))
      {
         // Read the barcodes using our options
         threadData.Barcodes = threadData.BarcodeReaderInstance.ReadBarcodes(image, LogicalRectangle.Empty, 0, null, threadData.ReadOptions);
      }

      Console.WriteLine("{0} has read {1} barcodes", threadData.Name, threadData.Barcodes.Length);
   }
   catch(Exception ex)
   {
      // Return the error to main
      threadData.Error = ex;
   }
   finally
   {
      // Tell main we are done
      threadData.FinishedEvent.Set();
   }
}

private static void RotateImage(RasterImage image)
{
   // Create a 90 degrees rotated version of Barcode1.tif

   RasterCodecs codecs = new RasterCodecs();

   RotateCommand rotate = new RotateCommand(90 * 100, RotateCommandFlags.Resize, RasterColor.FromKnownColor(RasterKnownColor.White));
   rotate.Run(image);
}

private static BarcodeReadOptions[] GetVerticalReadBarcodeOptions(BarcodeReader reader)
{
   // By default, the options read horizontal barcodes only, create an array of options capable of reading vertical barcodes

   // Notice, we cloned the default options in reader so we will not change the original options

   OneDBarcodeReadOptions oneDReadOptions = reader.GetDefaultOptions(BarcodeSymbology.UPCA).Clone() as OneDBarcodeReadOptions;
   oneDReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   FourStateBarcodeReadOptions fourStateReadOptions = reader.GetDefaultOptions(BarcodeSymbology.USPS4State).Clone() as FourStateBarcodeReadOptions;
   fourStateReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   PostNetPlanetBarcodeReadOptions postNetPlanetReadOptions = reader.GetDefaultOptions(BarcodeSymbology.PostNet).Clone() as PostNetPlanetBarcodeReadOptions;
   postNetPlanetReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   GS1DatabarStackedBarcodeReadOptions gs1StackedReadOptions = reader.GetDefaultOptions(BarcodeSymbology.GS1DatabarStacked).Clone() as GS1DatabarStackedBarcodeReadOptions;
   gs1StackedReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   PatchCodeBarcodeReadOptions patchCodeReadOptions = reader.GetDefaultOptions(BarcodeSymbology.PatchCode).Clone() as PatchCodeBarcodeReadOptions;
   patchCodeReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   PDF417BarcodeReadOptions pdf417ReadOptions = reader.GetDefaultOptions(BarcodeSymbology.PDF417).Clone() as PDF417BarcodeReadOptions;
   pdf417ReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   MicroPDF417BarcodeReadOptions microPdf417ReadOptions = reader.GetDefaultOptions(BarcodeSymbology.MicroPDF417).Clone() as MicroPDF417BarcodeReadOptions;
   microPdf417ReadOptions.SearchDirection = BarcodeSearchDirection.Vertical;

   // Even though this array will not contain all options, it should be enough to read all barcodes, since the version of ReadBarcodes we will use
   // will use the default options if an overriden is not passed
   BarcodeReadOptions[] readOptions =
   {
      oneDReadOptions, fourStateReadOptions, postNetPlanetReadOptions, gs1StackedReadOptions, patchCodeReadOptions, pdf417ReadOptions, microPdf417ReadOptions
   };

   return readOptions;
}
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.Forms
Imports Leadtools.Barcode
Imports Leadtools.ImageProcessing
Imports Leadtools.ImageProcessing.Color

' This class holds the data we will pass to each thread
Public Class MyThreadData
   ' This worker thread name
   Public Name As String
   ' Barcode reader instance
   Public BarcodeReaderInstance As BarcodeReader

   ' Array of options to use
   Public ReadOptions As BarcodeReadOptions()

   ' Image file name containing the barcodes
   Public ImageFileName As String

   ' Image containing the barcodes
   Public Image As RasterImage

   ' This will hold the barcodes found
   Public Barcodes As BarcodeData()

   ' In case of errors
   Public [Error] As Exception

   ' Event to notify when the thread is finished
   Public FinishedEvent As AutoResetEvent
End Class

<TestMethod(), Asynchronous()> _
Public Sub BarcodeReaderReadBarcodeExample6()
   BarcodeReader_ReadBarcodeExample6()
   EnqueueTestComplete()
End Sub

Public Sub BarcodeReader_ReadBarcodeExample6()
   Dim images As RasterImage() = New RasterImage(1) {}
   Dim originalImageFileName As String = "Barcode1.tif"
   Dim rotatedImageFileName As String = "Barcode1_Rotated90.tif"
   Dim imageFileNames As String() = New String() {originalImageFileName, rotatedImageFileName}

   Using outputStream As SampleImageStream = New SampleImageStream("Barcode1_Rotated90.tif")
      images(0) = SampleImage.Get(SampleImageNames.Barcode1_tif).Clone()
      images(1) = SampleImage.Get(SampleImageNames.Barcode1_tif).Clone()
      RotateImage(images(1))

      ' Create a Barcode engine
      Dim engine As BarcodeEngine = New BarcodeEngine()

      ' Get the Barcode reader instance
      Dim reader As BarcodeReader = engine.Reader

      ' Get a version of all read options that support rotated barcodes
      Dim verticalBarcodeReadOptions As BarcodeReadOptions() = GetVerticalReadBarcodeOptions(reader)

      ' Synchronization events
      Dim finishedEvents As AutoResetEvent() = New AutoResetEvent(1) {}

      ' Create the thread data objects
      Dim threadsData As MyThreadData() = New MyThreadData(1) {}
      Dim i As Integer = 0
      Do While i < threadsData.Length
         finishedEvents(i) = New AutoResetEvent(False)

         threadsData(i) = New MyThreadData()
         threadsData(i).BarcodeReaderInstance = reader
         threadsData(i).ReadOptions = Nothing
         threadsData(i).FinishedEvent = finishedEvents(i)
         i += 1
      Loop

      ' Setup the read options for the two threads
      threadsData(0).Name = "Read Default Options Thread"
      threadsData(0).ReadOptions = Nothing ' Default, or horizontal
      threadsData(1).Name = "Read Vertical Barcodes Thread"
      threadsData(1).ReadOptions = verticalBarcodeReadOptions

      Dim totalBarcodes As List(Of BarcodeData) = New List(Of BarcodeData)()

      ' Now loop through all the images and try to read the barcodes with both threads at the same time
      Dim index As Integer = 0
      For Each image As RasterImage In images
         Console.WriteLine("Reading barcodes from {0}", imageFileNames(index))

         For i = 0 To 1
            ' Clear the previous results (if any), set up the file name and run
            threadsData(i).Barcodes = Nothing
            threadsData(i).Error = Nothing
            threadsData(i).Image = image
            threadsData(i).ImageFileName = imageFileNames(index)
            ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf ReadBarcodesInThread), threadsData(i))
         Next i

         ' Wait till all the threads finishes
         WaitHandle.WaitAll(finishedEvents)

         ' Add the barcodes found to our list
         For i = 0 To 1
            If Not threadsData(i).Error Is Nothing Then
               Console.WriteLine("{0} had error {1}", threadsData(i).Name, threadsData(i).Error)
            ElseIf Not threadsData(i).Barcodes Is Nothing Then
               totalBarcodes.AddRange(threadsData(i).Barcodes)
            End If
         Next i

         index += 1
      Next image

      ' We are done, show the total number of barcodes read
      Console.WriteLine("Done. Total barcodes read: {0}", totalBarcodes.Count)
   End Using
End Sub

Private Shared Sub ReadBarcodesInThread(ByVal state As Object)
   Dim threadData As MyThreadData = TryCast(state, MyThreadData)

   Console.WriteLine("{0} is reading the barcodes", threadData.Name)

   Try
      ' Load the image
      Dim codecs As RasterCodecs = New RasterCodecs()

      Using image As RasterImage = codecs.Load(threadData.ImageFileName, 0, CodecsLoadByteOrder.BgrOrGray, 1, 1)
         ' Read the barcodes using our options
         threadData.Barcodes = threadData.BarcodeReaderInstance.ReadBarcodes(image, LogicalRectangle.Empty, 0, Nothing, threadData.ReadOptions)
      End Using

      Console.WriteLine("{0} has read {1} barcodes", threadData.Name, threadData.Barcodes.Length)
   Catch ex As Exception
      ' Return the error to main
      threadData.Error = ex
   Finally
      ' Tell main we are done
      threadData.FinishedEvent.Set()
   End Try
End Sub

Private Shared Sub RotateImage(ByVal image As RasterImage)
   ' Create a 90 degrees rotated version of Barcode1.tif

   Dim codecs As RasterCodecs = New RasterCodecs()

   Dim rotate As RotateCommand = New RotateCommand(90 * 100, RotateCommandFlags.Resize, RasterColor.FromKnownColor(RasterKnownColor.White))
   rotate.Run(image)
End Sub

Private Shared Function GetVerticalReadBarcodeOptions(ByVal reader As BarcodeReader) As BarcodeReadOptions()
   ' By default, the options read horizontal barcodes only, create an array of options capable of reading vertical barcodes

   ' Notice, we cloned the default options in reader so we will not change the original options

   Dim oneDReadOptions As OneDBarcodeReadOptions = TryCast(reader.GetDefaultOptions(BarcodeSymbology.UPCA).Clone(), OneDBarcodeReadOptions)
   oneDReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim fourStateReadOptions As FourStateBarcodeReadOptions = TryCast(reader.GetDefaultOptions(BarcodeSymbology.USPS4State).Clone(), FourStateBarcodeReadOptions)
   fourStateReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim postNetPlanetReadOptions As PostNetPlanetBarcodeReadOptions = TryCast(reader.GetDefaultOptions(BarcodeSymbology.PostNet).Clone(), PostNetPlanetBarcodeReadOptions)
   postNetPlanetReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim gs1StackedReadOptions As GS1DatabarStackedBarcodeReadOptions = TryCast(reader.GetDefaultOptions(BarcodeSymbology.GS1DatabarStacked).Clone(), GS1DatabarStackedBarcodeReadOptions)
   gs1StackedReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim patchCodeReadOptions As PatchCodeBarcodeReadOptions = TryCast(reader.GetDefaultOptions(BarcodeSymbology.PatchCode).Clone(), PatchCodeBarcodeReadOptions)
   patchCodeReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim pdf417ReadOptions As PDF417BarcodeReadOptions = TryCast(reader.GetDefaultOptions(BarcodeSymbology.PDF417).Clone(), PDF417BarcodeReadOptions)
   pdf417ReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   Dim microPdf417ReadOptions As MicroPDF417BarcodeReadOptions = TryCast(reader.GetDefaultOptions(BarcodeSymbology.MicroPDF417).Clone(), MicroPDF417BarcodeReadOptions)
   microPdf417ReadOptions.SearchDirection = BarcodeSearchDirection.Vertical

   ' Even though this array will not contain all options, it should be enough to read all barcodes, since the version of ReadBarcodes we will use
   ' will use the default options if an overriden is not passed
   Dim readOptions As BarcodeReadOptions() = {oneDReadOptions, fourStateReadOptions, postNetPlanetReadOptions, gs1StackedReadOptions, patchCodeReadOptions, pdf417ReadOptions, microPdf417ReadOptions}

   Return readOptions
End Function
Requirements

Target Platforms

See Also

Reference

BarcodeReader Class
BarcodeReader Members
Overload List
ReadBarcode(RasterImage image, LogicalRectangle searchBounds, BarcodeSymbology symbology)
ReadBarcode(RasterImage image, LogicalRectangle searchBounds, BarcodeSymbology symbology, BarcodeReadOptions options)
ReadBarcode(RasterImage image, LogicalRectangle searchBounds, BarcodeSymbology[] symbologies)
ReadBarcode(RasterImage image, LogicalRectangle searchBounds, BarcodeSymbology[] symbologies, BarcodeReadOptions[] options)
ReadBarcodes(RasterImage image, LogicalRectangle searchBounds, int maximumBarcodes, BarcodeSymbology[] symbologies)
Programming with LEADTOOLS Barcode
Supported Barcode Symbologies
Unlocking Barcode Support
Reading Barcodes Tutorial

 

 


Products | Support | Contact Us | Copyright Notices
© 2006-2014 All Rights Reserved. LEAD Technologies, Inc.

Leadtools.Barcode requires a Barcode Module license and unlock key. For more information, refer to: LEADTOOLS Toolkit Features